package com.po.scrapy.spiders;

import com.baomidou.mybatisplus.core.override.MybatisMapperProxy;
import com.fasterxml.jackson.core.TreeNode;
import com.po.consts.enums.RebWebEnum;
import com.po.consts.redis.RedisKeyPrefix;
import com.po.mapper.ArticleMapper;
import com.po.pojo.Article;
import com.po.pojo.ArticleLabel;
import com.po.pojo.Label;
import com.po.service.ArticleLabelService;
import com.po.service.ArticleService;
import com.po.service.LabelService;
import com.sun.org.apache.regexp.internal.RE;
import org.apache.commons.lang3.StringUtils;
import org.assertj.core.internal.bytebuddy.asm.Advice;
import org.jsoup.helper.StringUtil;
import org.jsoup.nodes.Element;
import org.jsoup.nodes.Node;
import org.jsoup.nodes.TextNode;
import org.jsoup.select.Elements;
import org.jsoup.select.Evaluator;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.pipeline.ConsolePipeline;
import us.codecraft.webmagic.processor.PageProcessor;
import us.codecraft.webmagic.selector.Selectable;

import javax.annotation.Resource;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Spliterator;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 红网首页爬虫
 *
 * @author zxw
 * @date 2020/7/28 21:21
 */
@Component
public class RedWebProcessor implements PageProcessor, BeanFactoryAware {
    private final String REG = "retnet.cn.*";
    private ArticleService articleService;
    private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    private static LabelService labelService;
    private static ArticleLabelService articleLabelService;
    private static StringRedisTemplate redisTemplate;
    private static Pattern pattern = Pattern.compile("[^>]+[<]");

    private Site site = Site.me().setDomain("http://www.rednet.cn/");

    public RedWebProcessor(ArticleService articleService) {
        this.articleService = articleService;
    }

    public RedWebProcessor() {
    }

    public void process(Page page) {
//        String url = page.getHtml().links().regex("http://www.rednet.cn/").toString();
//        page.addTargetRequests(url);
//        page.addTargetRequest(url);
//        System.out.println(page.getHtml().get());
//        List<String> list = page.getHtml().xpath("//a").all();
//        List<String> list2 = page.getResultItems().xpath("//a/text()").all();
        try {
            Selectable detail = page.getHtml().xpath("//section[contains(@class,'f_right detail_article_content')]");
            if (detail.all().size() != 0) {
                List<Label> labels = this.labelService.selectAll();
                for (Label label : labels) {
                    if (Pattern.matches("[\\d\\D]*" + label.getLabel() + "[\\d\\D]*", detail.get())) {
//                        Article url = articleService.findByUrl(page.getUrl().get());
//                        redisTemplate.opsForSet().getOperations().
//                        if (url == null) {
                        // <span class="p_l_10">来源：红网综合</span>
                        // <span class="p_l_10">编辑：朱婷劼 </span>
                        // <span class="p_l_10">2020-05-22 09:34:54</span>
                        // <span class="p_l_10" id="numpv"></span>
                        List<String> source = page.getHtml().xpath("//div[@class='m_b_25']/span/text()").all();
                        Article article = new Article();
                        article.setAuthor("zxw");
                        article.setLinkUrl(page.getUrl().get());
                        article.setTitle(page.getHtml().xpath("//h1[contains(@class,detail_title)]/text()").get());
                        StringBuilder sb = new StringBuilder();
                        Pattern pattern = Pattern.compile("[\\u4e00-\\u9fa5]*");
                        Matcher matcher = pattern.matcher(detail.get());
                        while (matcher.find()) {
                            String group = matcher.group();
                            if (StringUtils.isNoneEmpty(group)) {
                                sb.append(group);
                            }
                        }
                        article.setContent(sb.toString());
                        article.setSourceId(source.get(0));
                        article.setAuthor(source.get(1));
                        article.setPublishTime(sdf.parse(source.get(3)));
                        article.setCreateTime(new Date());
                        article.setUpdateTime(new Date());
                        Integer id = articleService.insert(article);
                        ArticleLabel articleLabel = new ArticleLabel();
                        articleLabel.setLabelId(label.getId());
                        articleLabel.setArticleId(id);
                        articleLabel.setValue(label.getValue());
                        articleLabelService.insert(articleLabel);
                        redisTemplate.opsForSet().add(RedisKeyPrefix.HSET_KEY_RED_WEB, page.getUrl().get());
                        break;
                    }
                }
            } else {
                Iterator<Element> iterator = page.getHtml().getDocument().getElementsByTag("a").iterator();
                while (iterator.hasNext()) {
                    Element element = iterator.next();
                    if (Pattern.matches(".*rednet.cn.*", element.attr("href"))) {
                        Boolean result = redisTemplate.opsForSet().isMember(RedisKeyPrefix.HSET_KEY_RED_WEB, element.attr("href"));
                        if (!result) {
                            page.addTargetRequest(element.attr("href"));
                        }
                    }
                }
            }
        } catch (Exception e) {
            System.out.println("*******************");
            System.out.println("url:[" + page.getUrl().get() + "]");
            System.out.println("爬虫异常,错误原因[" + e.getMessage() + "]");
            System.out.println("*******************");
        }
//        page.putField("title", page.getHtml().xpath("//a").toString());
//        page.putField("content", page.getHtml().$("div.content").toString());
//        page.putField("tags", page.getHtml().xpath("//div[@class='BlogTags']/a/text()").all());
    }

    public Site getSite() {
        return site;

    }

    public static void main(String[] args) {
//        Spider.create(new RedWebProcessor()).addUrl("http://www.rednet.cn/")
//                .addPipeline(new ConsolePipeline()).run();
        String s = "<section class=\"f_right detail_article_content\"> \n" +
                " <p style=\"text-indent: 2em; text-align: justify;\"><strong>省委常委会召开会议</strong></p>\n" +
                " <p style=\"text-indent: 2em; text-align: justify;\"><strong>传达学习习近平总书记重要讲话和中央有关会议精神</strong></p>\n" +
                " <p style=\"text-indent: 2em; text-align: justify;\"><strong>研究部署政治建警扫黑除恶脱贫攻坚等工作</strong></p>\n" +
                " <p style=\"text-indent: 2em; text-align: justify;\"><strong>杜家毫主持并讲话</strong></p>\n" +
                " <p style=\"text-indent: 2em; text-align: justify;\">7月31日上午，湖南省委常委会召开会议，深入学习贯彻习近平总书记在企业家座谈会和7月30日中共中央政治局会议上的重要讲话精神，传达《习近平谈治国理政》第三卷出版座谈会精神，听取关于全省公安机关政治建警工作情况、中央督导“回头看”以来全省扫黑除恶专项斗争工作情况、国务院扶贫开发领导小组对湖南开展脱贫攻坚督查有关情况的汇报，部署做好相关工作。省委书记杜家毫主持会议并讲话。</p>\n" +
                " <p style=\"text-indent: 2em; text-align: justify;\">会议强调，要进一步加大保市场主体力度，提升纾困惠企政策的精准度、协同化和受益率，打造市场化法治化国际化营商环境，依法保护企业家合法权益，积极构建亲清新型政商关系，光明磊落与企业打交道、帮企业解难题。要弘扬企业家精神，着力打造一批具有爱国情怀、创新精神、诚信守法、社会责任、国际视野的新时代“湘商”，培育一批质量更好、效益更高、竞争力更强的“湘企”。</p>\n" +
                " <p style=\"text-indent: 2em; text-align: justify;\">会议指出，要深入分析研究“十四五”发展面临机遇和挑战的新发展新变化，找准湖南发展的潜力和优势，争取更多项目和试点进入国家“十四五”笼子，高质量编制好湖南“十四五”发展规划。要清醒把握当前经济形势，建立疫情防控和经济社会发展工作中长期协调机制，把“加快形成以国内大循环为主体、国内国际双循环相互促进的新发展格局”的要求落实到湖南各项经济工作之中。要扎实做好下半年经济工作，继续抓好常态化疫情防控，把握扩大内需这个战略基点，大力保护和激发市场主体活力，着力稳定和优化产业链供应链，持续扩大消费需求，加快新型基础设施建设，继续以长株潭一体化发展为龙头推进新型城镇化，促进房地产市场平稳健康发展，坚定不移打好三大攻坚战，扎实做好“六稳”工作、全面落实“六保”任务，努力完成全年经济社会发展目标任务，确保全面建成小康社会和“十三五”规划圆满收官。</p>\n" +
                " <p style=\"text-indent: 2em; text-align: justify;\">会议强调，全省各级党组织要将《习近平谈治国理政》第三卷作为最新教材纳入理论学习中心组、党校和行政学院、高校思政课等学习培训内容，领导干部发挥领学带学作用，切实将学习成效转化为加快各项事业高质量发展的强大动力。要组织开展分众化、对象化理论宣传普及，用好新时代文明实践中心、县级融媒体中心和“学习强国”平台，创新方式方法和形式载体，推动党的创新理论“六进”。要组织智库和专家学者推出更多有针对性的研究成果，为科学决策提供理论支撑。</p>\n" +
                " <p style=\"text-indent: 2em; text-align: justify;\">会议强调，要坚持和加强党对公安工作的绝对领导、全面领导，抓住“讲政治”和“全面从严”这个关键，以中央政法委和公安部开展的教育整顿为契机，坚持严管与厚爱结合、激励与约束并重，坚持党管干部原则，打造一支绝对忠诚、绝对纯洁、绝对可靠的公安队伍。</p>\n" +
                " <p style=\"text-indent: 2em; text-align: justify;\">会议指出，要进一步扛牢政治责任，紧扣目标要求，落实工作举措，精准发力攻坚，持续保持依法打击黑恶势力的高压态势，加快推进“六清”行动，确保湖南扫黑除恶专项斗争取得压倒性胜利。要进一步巩固延伸拓展成果，把扫黑除恶与平安建设结合起来，建立健全抓源治本的长效机制，实现常治长效。</p>\n" +
                " <p style=\"text-indent: 2em; text-align: justify;\">会议指出，要针对国务院扶贫开发领导小组脱贫攻坚督查反馈和自身发现的问题，坚持新老问题一起改，确保问题整改清零。要进一步查漏洞补短板，及时解决好疫情汛情影响下住房保障、安全饮水、补损增收等问题，防止因灾致贫返贫。要切实巩固脱贫成果，加大产业、就业帮扶力度，扎实推进“六覆盖”工作，积极推进脱贫攻坚与乡村振兴有机衔接。要保持定力韧劲，防止松懈情绪、过关思想，力戒形式主义官僚主义，严防虚假脱贫、数字脱贫。要结合明年村“两委”换届，着力打造一支“永不走的扶贫工作队”。</p>\n" +
                " <p style=\"text-indent: 2em; text-align: justify;\">会议还研究了其他事项。</p> \n" +
                " <p class=\"f14 m_t_50 m_b_5 h20\" style=\"color:#888\">来源：湖南日报</p> \n" +
                " <p class=\"f14 m_t_5 m_b_5 h20\" style=\"color:#888\">作者：贺佳 </p> \n" +
                " <p class=\"f14 m_t_5 m_b_5 h20\" style=\"color:#888\">编辑：秦舷 </p> \n" +
                " <!--判断是否开启评论,只有开启评论的才可以点赞 --> \n" +
                " <a id=\"toLike\" class=\"fav like m_t_50 m_b_30\"> <span class=\"f18 starCount\"></span> </a> \n" +
                "</section>";
        Pattern pattern = Pattern.compile("[\\u4e00-\\u9fa5]*");
        Matcher matcher = pattern.matcher(s);
        while (matcher.find()) {
            String group = matcher.group();
            if (StringUtils.isNoneEmpty(group)) {
                System.out.println(group);
            }
        }
        System.out.println(Pattern.matches("[\\d\\D]*section[\\d\\D]*", s));
    }

    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        this.labelService = (LabelService) beanFactory.getBean("labelServiceImpl");
        this.articleLabelService = (ArticleLabelService) beanFactory.getBean("articleLabelServiceImpl");
        this.redisTemplate = (StringRedisTemplate) beanFactory.getBean("stringRedisTemplate");
    }
}
